package com.qingcloud.adminbackend.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qingcloud.adminbackend.entity.product.SysProductCommand;
import com.qingcloud.adminbackend.entity.product.SysProductCommandDto;
import com.qingcloud.adminbackend.entity.product.SysProductDecoder;
import com.qingcloud.adminbackend.entity.product.SysProductType;
import com.qingcloud.adminbackend.pojo.IdListParam;
import com.qingcloud.adminbackend.pojo.dto.sysproduct.PageProductListDTO;
import com.qingcloud.adminbackend.pojo.dto.sysproduct.SysProductAddDTO;
import com.qingcloud.adminbackend.pojo.dto.sysproduct.SysProductModDTO;
import com.qingcloud.adminbackend.pojo.dto.sysproduct.SysProductSourceVO;
import com.qingcloud.adminbackend.pojo.product.CommandResultDTO;
import com.qingcloud.adminbackend.pojo.product.ComponentParam;
import com.qingcloud.adminbackend.pojo.product.ProductCommandFieldDTO;
import com.qingcloud.adminbackend.pojo.vo.sysproduct.PageProductListVO;
import com.qingcloud.adminbackend.pojo.vo.sysproduct.ProductDetailVO;
import com.qingcloud.adminbackend.pojo.vo.sysproduct.ProductListVO;
import com.qingcloud.adminbackend.pojo.vo.sysproduct.SysProductCommandVO;
import com.qingcloud.base.pojo.PageResult;

import java.util.List;

/**
 * <p>
 * 蛙鸣产品型号定义 服务类
 * </p>
 *
 * @author luozehua
 * @since 2019-04-12
 */
public interface ISysProductTypeService extends IService<SysProductType> {

    /**
     * 新增产品
     *
     * @param sysProductAddDTO 新增产品请求DTO
     * @param currentUserId    当前用户id
     * @return 产品id
     */
    Long addProduct(SysProductAddDTO sysProductAddDTO, String currentUserId);

    /**
     * 修改产品
     *
     * @param sysProductModDTO 修改产品请求DTO
     * @param currentUserId    当前用户id
     * @return 产品id
     */
    Long modProduct(SysProductModDTO sysProductModDTO, String currentUserId);

    /**
     * 删除产品
     *
     * @param productTypeIdList 产品id列表
     */
    void deleteProductList(List<Integer> productTypeIdList);

    /**
     * 分页产品列表
     *
     * @param pageProductListDTO 请求DTO
     * @return 分页返回数据
     */
    Page<PageProductListVO> pageProductList(PageProductListDTO pageProductListDTO);

    /**
     * 产品详情查询
     *
     * @param productTypeId 产品id
     * @return 产品详情
     */
    ProductDetailVO productDetail(Integer productTypeId);

    /**
     * 保存或者修改产品解码器
     *
     * @param productDecoderDTO 请求DTO
     * @return 产品id
     */
    Integer addOrModProductDecoder(List<SysProductDecoder> decoders);

    /**
     * 删除解码器
     */
    int deleteDecoder(IdListParam param);

    /**
     * 查询产品解码器
     *
     * @param productId 产品id
     * @return 产品源码信息
     */
    SysProductSourceVO productDecoderInfo(Integer productId);

    /**
     * 保存或者修改产品指令
     *
     * @param dto           请求DTO
     * @param currentUserId 当前用户
     * @return 指令项目工作路径
     */
    SysProductCommand saveOrModProductCommand(SysProductCommandDto dto, String currentUserId);

    /**
     * 删除产品指定
     *
     * @param productCommandId 产品指令id
     * @return 影响条数
     */
    Integer deleteProductCommand(Integer productCommandId);


    /**
     * 查询产品指令信息
     *
     * @param productCommandId 产品指令id
     * @return 产品信息
     */
    SysProductCommandVO queryCommandInfo(Integer productCommandId);

    /**
     * 查询所有产品列表
     *
     * @return 分页返回数据
     */
    List<ProductListVO> selectAllProductList();

    /**
     * 保存并解析指令源码
     *
     * @param commandId 指令ID
     * @return 解析内容
     */
    String saveCommandSource(Integer commandId);

    /**
     * 查询指令字段信息
     */
    ProductCommandFieldDTO findCommandField(Integer commandId);

    /**
     * 获取指令内容
     */
    String getCommandContent(JSONObject jsonObject);

    /**
     * 发送指令
     */
    CommandResultDTO sendCommand(JSONObject jsonObject);


    PageResult<SysProductDecoder> pageComponentDecoders(ComponentParam componentParam);

    /**
     * 分页查询关联的解码器
     */
    PageResult<SysProductDecoder> productDecoderPage(ComponentParam componentParam);

}
